在鐵人賽中,最後一個要來介紹的章節是 Class!我覺得這是所有章節中最難懂、最抽象的部分,真的是需要花點時間搞懂,那我們就開始ㄅ!
Class 是一個新的概念,有別於以往我們所介紹的 if
、for
等程序化程式設計(procedural programming),Class 屬於物件導向的程式設計(object-oriented programming),Class 其實就是 C++ 中的 Struct,因為 C 語言中的 Struct 有一些缺點,因此在 C++中就有更便利的 Class 功能發明了!
首先,我們可以根據其 visibility,可以分類出 private
、public
members。
private members
只能在同個 class 中被存取。
public members
可以在任何程式中被存取。
(private, public 中的 statements 可以自己按照需求定義)
(myVector 為我所建立的 class name)
Class myVector {
private:
int n;
int* m;
public:
void init(int dim);
void print();
Constructor 會在物件被建立時自動被呼叫,而他的名字會與 class 一樣,且不會回傳任何東西。
若我們沒有自己定義的話,編譯器會自己幫我們定義一個default constructor
。
寫 constructor 時,可以放在 public 或 private 中,:
private:
myVector();
public:
myVector();
destructor 在物件被消滅時被呼叫。與 constructor 不同的是,他只能被放在 public 中,如果我們沒有自己定義的話系統一樣會自己定義 default destructor
。若我們要自己定義的話,前面要加上~
:
Public:
~myVector();
而在 class 外,我們通常會再另外將動態記憶體釋出:
myVector::~myVector() {
delete []m;
}
有的時候,我們想用 private member,這時候可以用 getter 與 setter 來取用這個變數:
class MyVector {
private:
int n;
int* m;
public:
// ...
int getN() { return n; }
void setN(int v) { n = v; }
};
如果一個變數在所有 object 中都應該要有相同的 value 就可以運用靜態變數,其對全部的 object 都會保持不變。
可以從 instance function 中存取靜態變數,但是不能存 static function 中存取 instance member。
Class Window {
private:
// …
static int barColor;
public:
static int getBarColor();
static void setBarColor(int color);
// …
}
int Window::barColor = 0; // 初始化,靜態變數要是 global variable
int Window::getBarColor() {
return barColor;
}
void Window::setBarColor(int color) {
barColor = color;
}
另外,當我們要取用靜態變數時,盡量用className::memberName
!
Static members 還有一種使用方式是計算一物件被呼叫了幾次,我在這邊就先不細講。
最後,又要提到 pointer 了,一個 pointer 可以指向任一物件,例如,我們可以利用它來慛去一個物件的 address。
int main() {
myVector v(5);
myVector* ptrV = &v;
return 0;
}
如果我們設一個物件v
,而 v
中有一 instance function 叫 print()
,且我們有一個 pointer ptrA
指向物件 v
,我們可以寫
(*ptrA).print()
來呼叫 print()
這個函數。
如果覺得太麻煩,可以簡化成 ptrA->print()
,也就是:
int main() {
myVector v(5);
myVector* ptrV = &v;
v.print();
ptrV->print();
return 0;
}
建立 object pointers 的陣列比建立 object 的陣列來的好也更 efficient,因此我們傾向建立存 object pointers 的陣列。
以上,差不多就告一段落啦!